package demo04.Handler;

import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.util.Locale;

/*
    实现类1:用于完成将查询出来的一条记录,封装到student对象中
 */
public class BeanHandler<T> implements ResultSetHandler<T> {
    //1.声明对象类型变量
    private Class<T> beanClass;

    //2.有参构造对变量赋值
    public BeanHandler(Class<T> beanClass){
        this.beanClass=beanClass;
    }

    @Override
    public T handler(ResultSet rs) {
        //声明对象
        T bean=null;
        try {
           //4.创建传递参数的对象
            bean= beanClass.newInstance();
            //5.判断是否有结果集
            if(rs.next()){
                //6.得到所有的列名
                //6.1先得到结果集的源信息
                ResultSetMetaData rsmd = rs.getMetaData();
                //6.2还要得到多少列
                int columnCount = rsmd.getColumnCount();
                //6.3遍历列数
                for (int i = 1; i <= columnCount; i++) {
                    //6.4得到每一列的列名
                    String columnName = rsmd.getColumnName(i);
                    //6.5通过列名获取数据
                    Object columnValue = rs.getObject(columnCount);
                    //6.6列名就是对象中成员变量的名称,于是可以得到对象中的描述器(get和set方法)
                    PropertyDescriptor pd = new PropertyDescriptor(columnName.toLowerCase(Locale.ROOT), beanClass);
                    //6.7获取set方法
                    Method writeMethod = pd.getWriteMethod();
                    //6.8执行set方法,赋值
                    writeMethod.invoke(bean,columnValue);

                }
            }
        }catch (Exception e){
            e.printStackTrace();
        }
        return bean;
    }
}
